﻿// -----------------------------------------------------------------------
// <copyright file="Comunes.cs" company="">
// TODO: Update copyright text.
// </copyright>
// -----------------------------------------------------------------------

namespace SolutionExporterhardvin_y_p
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using hardvinyp.xrm;
    using System.IO;
    using System.Security;
    using System.Security.Cryptography;


    /// <summary>
    /// TODO: Update summary.
    /// </summary>
    public class Comunes
    {
        private static List<TConexion> conexiones = new List<TConexion>();

        private static TConexion conexion = new TConexion();

        public static TConexion Conexion
        {
            get
            {
                return conexion;
            }
            set
            {
                conexion = value;
            }
        }

        public static List<TConexion> Conexiones
        {
            get
            {
                return conexiones;
            }
            set
            {
                conexiones = value;
            }
        }

        public List<TConexion> ListarConexiones()
        {
            List<TConexion> conexionesfinal = new List<TConexion>();

            if (File.Exists("Config.cfg"))
            {
                //StreamReader stw = new StreamReader("Config.cfg", Encoding.ASCII);
                string configuracion = File.ReadAllText("Config.cfg");
                configuracion = descifrar(configuracion);
                string[] ConexionesEncontradas = configuracion.Split(';');

                foreach (string cnx in ConexionesEncontradas)
                {
                    string[] Parametros = cnx.Split(',');

                    TConexion conexion = new TConexion();
                    conexion.Nombreconexion = Parametros[0].Split('=')[1];
                    conexion.Dominio = Parametros[1].Split('=')[1];
                    conexion.Usuario = Parametros[2].Split('=')[1];
                    conexion.Rutaservicio = Parametros[3].Split('=')[1];
                    conexion.Nueva = false;

                    string solucion = Parametros[4].Split('=')[1].Replace("[", "").Replace("]", "");

                    string[] soluciones = solucion.Split('&');

                    foreach (string sln in soluciones)
                    {
                        conexion.Soluciones.Add(sln);
                    }
                    conexionesfinal.Add(conexion);
                }

                return conexionesfinal;
            }
            else
            {
                return null;
            }
        }


        string clave = "P4m3l@ym@rv1n";
        public string cifrar(string cadena)
        {

            byte[] llave; //Arreglo donde guardaremos la llave para el cifrado 3DES.

            byte[] arreglo = UTF8Encoding.UTF8.GetBytes(cadena); //Arreglo donde guardaremos la cadena descifrada.

            // Ciframos utilizando el Algoritmo MD5.
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            llave = md5.ComputeHash(UTF8Encoding.UTF8.GetBytes(clave));
            md5.Clear();

            //Ciframos utilizando el Algoritmo 3DES.
            TripleDESCryptoServiceProvider tripledes = new TripleDESCryptoServiceProvider();
            tripledes.Key = llave;
            tripledes.Mode = CipherMode.ECB;
            tripledes.Padding = PaddingMode.PKCS7;
            ICryptoTransform convertir = tripledes.CreateEncryptor(); // Iniciamos la conversión de la cadena
            byte[] resultado = convertir.TransformFinalBlock(arreglo, 0, arreglo.Length); //Arreglo de bytes donde guardaremos la cadena cifrada.
            tripledes.Clear();

            return Convert.ToBase64String(resultado, 0, resultado.Length); // Convertimos la cadena y la regresamos.
        }

        public string descifrar(string cadena)
        {

            byte[] llave;

            byte[] arreglo = Convert.FromBase64String(cadena); // Arreglo donde guardaremos la cadena descovertida.

            // Ciframos utilizando el Algoritmo MD5.
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            llave = md5.ComputeHash(UTF8Encoding.UTF8.GetBytes(clave));
            md5.Clear();

            //Ciframos utilizando el Algoritmo 3DES.
            TripleDESCryptoServiceProvider tripledes = new TripleDESCryptoServiceProvider();
            tripledes.Key = llave;
            tripledes.Mode = CipherMode.ECB;
            tripledes.Padding = PaddingMode.PKCS7;
            ICryptoTransform convertir = tripledes.CreateDecryptor();
            byte[] resultado = convertir.TransformFinalBlock(arreglo, 0, arreglo.Length);
            tripledes.Clear();

            string cadena_descifrada = UTF8Encoding.UTF8.GetString(resultado); // Obtenemos la cadena
            return cadena_descifrada; // Devolvemos la cadena
        }


        public void GuardarCadenaConexion()
        {
            try
            {

                string configuracion = "";
                foreach (TConexion cn in Conexiones)
                {
                    configuracion = configuracion.Replace("[Puntoycoma]", ";");
                    string soluciones = "";

                    foreach (string solucion in cn.Soluciones)
                    {
                        soluciones = soluciones.Replace("[Comodinamper]", "&");
                        soluciones += solucion + "[Comodinamper]";
                    }
                    soluciones = soluciones.Replace("[Comodinamper]", "");

                    configuracion +=
                        string.Format(
                            "Conexion={0},Dominio={1},usuario={2},organization={3},soluciones=[{4}][Puntoycoma]",
                            cn.Nombreconexion,
                            cn.Dominio,
                            cn.Usuario,
                            cn.Rutaservicio,
                            soluciones);

                }
                configuracion = configuracion.Replace("[Puntoycoma]", "");

                if (configuracion != "")
                {
                    configuracion = cifrar(configuracion);
                    File.WriteAllText("Config.cfg", configuracion);

                }
            }
            catch (Exception)
            {

            }

        }
    }
}
